package pers.zb.center.service.user.api.impl.activemq;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;
import pers.zb.center.common.core.enums.SeparatorEnum;
import pers.zb.center.service.user.api.activemq.TopicMessageService;
import pers.zb.center.service.user.vo.activemq.PersonInfo;

import javax.annotation.Resource;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.Topic;

@Service("topicMessageServiceImpl")
public class TopicMessageServiceImpl implements TopicMessageService {

    private Logger LOGGER = LoggerFactory.getLogger(getClass());

    /**
     * 角色权限更新，消息发送模版
     */
    @Resource(name = "permissionUpdateNotifyTemplate")
    private JmsTemplate permissionUpdateNotifyTemplate;

    /**
     * 角色权限更新，队列名称的前缀
     */
    @Value("#{configProperties['activemq.permission.queue.prefix']}")
    private String permissionQueuePrefix;
    

    @Override
    public void sendPermissionUpdateMessage(final String appCode,final String roleName) {
        if (permissionUpdateNotifyTemplate != null) {
            try {
                // String destinationName = PropertiesConfigUtil.getProperty("activemq.permission.queue.prefix").concat(appCode);
                
                /**
                 * 这里拼接了appCode，主要作用是区分不同的应用，实现不同应用的消息通知：
                 *      我们知道，appCode代表的是具体的应用编码，当代码执行到这里的时候，也就是说，对appCode所关联的应用进行了角色权限的变更。
                 *      所以，我们需要通知appCode对应的应用(不需要通知其他app应用，因为我们更新的是appCode对应的应用的角色权限，其他应用的角色权限没有变化)，进行动态权限的更新。
                 *      而每个appCode应用都配置了一个MQ的消息监听器，详情配置请看应用中的配置：/resources/application/activemq/spring-activemq-topic-permission.xml ，里面有Listener的监听器配置
                 *      
                 *      以上，便实现了不同应用的角色权限的动态更新。
                 */
                String destinationName = permissionQueuePrefix.concat(appCode);//组装目的地名称
                
                /**
                 * destinationName表示的是消息目的地
                 * 
                 * 假如appCode的值为zb-center-web-boss，则destinationName表示的目的地的值为 permission_zb-center-web-boss
                 * 表示的是zb-center-web-boss应用所监听的消息目的地，当permission_zb-center-web-boss这个目的地收到消息后，zb-center-web-boss应用会收到消息通知，从而实现对zb-center-web-boss应用的角色权限动态更新。
                 * 
                 * [zb-center-web-boss应用为何会收到通知？]
                 * 详情请看 zb-center-web-boss应用中的配置：/resources/application/activemq/spring-activemq-topic-permission.xml ，里面有Listener的监听器配置
                 */
                permissionUpdateNotifyTemplate.send(destinationName, new MessageCreator() {
                    @Override
                    public Message createMessage(Session session) throws JMSException {
                        return session.createTextMessage(appCode + SeparatorEnum.PERMISSION_UPDATE.getType() + roleName);
                    }
                });
                LOGGER.info("TopicMessageServiceImpl ----> 消息服务通知appCode为：{0}的应用更新权限，被更新的角色名称:{1}", appCode,roleName);
            } catch (Exception e) {
                LOGGER.error("TopicMessageServiceImpl ----> 消息服务通知appCode为：{0}的应用更新权限异常，被更新的角色名称:{1}", appCode, roleName, e);
            }
        }
    }

}
